package com.tianyadu.mmall.core.common;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.tianyadu.mmall.core.enums.ResponseCodeEnum;
import org.codehaus.jackson.map.annotate.JsonSerialize;

import java.io.Serializable;

/**
 * 自定义响应信息封装
 *
 * @author xueyj
 * @date 2019-06-06 17:08
 */
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class ResultResponse<T> implements Serializable {
    private static final long serialVersionUID = -6547209579290360289L;
    /**
     * 状态值
     */
    private int status;
    /**
     * 消息
     */
    private String msg;
    /**
     * 泛型使用 -- 多数据类型之间便捷切换无需指定单一数据类型
     */
    private T data;

    /**
     * 状态码构造器
     *
     * @param status 状态
     */
    private ResultResponse(int status) {
        this.status = status;
    }

    /**
     * 状态码，数据构造器
     *
     * @param status 状态码
     * @param data   数据
     */
    private ResultResponse(int status, T data) {
        this.status = status;
        this.data = data;
    }

    /**
     * 状态码，自定义msg，数据构造器
     *
     * @param status 状态码
     * @param msg    自定义msg
     * @param data   数据
     */
    private ResultResponse(int status, String msg, T data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 状态，自定义msg构造器
     *
     * @param status 状态码
     * @param msg    自定义msg
     */
    private ResultResponse(int status, String msg) {
        this.status = status;
        this.msg = msg;
    }

    /**
     * 获取成功code
     *
     * @param <T>
     * @return
     */
    public static <T> ResultResponse<T> createBySuccess() {
        // 对应上面  private ServerResponse(int status) 构造器
        return new ResultResponse<T>(ResponseCodeEnum.SUCCESS.getCode());
    }

    /**
     * 获取成功code 自定义信息
     *
     * @param msg
     * @param <T>
     * @return
     */
    public static <T> ResultResponse<T> createBySuccessMessage(String msg) {
        // 对应上面  private ServerResponse(int status,String msg) 构造器
        return new ResultResponse<T>(ResponseCodeEnum.SUCCESS.getCode(), msg);
    }

    /**
     * 获取成功code 传入data
     *
     * @param data
     * @param <T>
     * @return
     */
    public static <T> ResultResponse<T> createBySuccess(T data) {
        // 对应上面  private ServerResponse(int status,T data) 构造器
        return new ResultResponse<T>(ResponseCodeEnum.SUCCESS.getCode(), data);
    }

    /**
     * 获取成功code 自定义信息 传入data
     *
     * @param msg
     * @param data
     * @param <T>
     * @return
     */
    public static <T> ResultResponse<T> createBySuccess(String msg, T data) {
        // 对应上面  private ServerResponse(int status,String msg,T data) 构造器
        return new ResultResponse<T>(ResponseCodeEnum.SUCCESS.getCode(), msg, data);
    }

    /**
     * 获取失败code 填充默认失败desc（描述）
     *
     * @param <T>
     * @return
     */
    public static <T> ResultResponse<T> createByError() {
        // 对应上面  private ServerResponse(int status,String msg) 构造器 获取失败code desc（描述）
        return new ResultResponse<T>(ResponseCodeEnum.ERROR.getCode(), ResponseCodeEnum.ERROR.getDesc());
    }

    /**
     * 获取失败code 填充自定义错误提示信息
     *
     * @param <T>
     * @return
     */
    public static <T> ResultResponse<T> createByErrorMessage(String errorMessage) {
        // 对应上面  private ServerResponse(int status,String msg) 构造器 获取失败code desc（描述）
        return new ResultResponse<T>(ResponseCodeEnum.ERROR.getCode(), errorMessage);
    }

    /**
     * 自定义失败code 填充自定义错误提示信息
     *
     * @param <T>
     * @return
     */
    public static <T> ResultResponse<T> createByErrorMessage(int errorCode, String errorMessage) {
        // 对应上面  private ServerResponse(int status,String msg) 构造器 获取失败code desc（描述）
        return new ResultResponse<T>(ResponseCodeEnum.ERROR.getCode(), errorMessage);
    }

    /**
     * 判断是否成功
     * 使之不在json序列化结果当中
     *
     * @return
     */
    @JsonIgnore
    public boolean isSuccess() {
        return this.status == ResponseCodeEnum.SUCCESS.getCode();
    }

    public int getStatus() {
        return status;
    }

    public String getMsg() {
        return msg;
    }

    public T getData() {
        return data;
    }
}